Copyright © 2021 ARC, All rights reserved
Symbol | Comment |
---|---|
tr | Time to maturity |
t | Time to maturity (interpolated) |
yr | Yield to maturity |
y | Yield to maturity (interpolated) |
s | Bootstrapped spot rate |
We're going to construct in detail a zero-coupon yield curve, called zero curve as well, with bonds by using bootstrapping method.
bond type | face value | interest periodicity | maturity | coupon rate | price | |
---|---|---|---|---|---|---|
0 | zero_coupon | 100 | 0D | 3M | 0.00 | 97.5 |
1 | zero_coupon | 100 | 0D | 6M | 0.00 | 94.9 |
2 | zero_coupon | 100 | 0D | 1Y | 0.00 | 90.0 |
3 | fixed_rate | 100 | 6M | 1Y6M | 0.08 | 96.0 |
4 | fixed_rate | 100 | 6M | 2Y | 0.12 | 101.6 |
Before going into details regarding the bootstrapping algorithm, we should explain the difference between yield curve and spot rate curve.
By definition, the yield curve shows several bond yields to maturity (ytm) across different times to maturity (ttm). Yield to maturity is an overall discount rate which equalizes principal and coupon payments to the initial investment value, assuming reinvestability of all cash flows.
In contrast to the yield curve, a spot rate curve represents spot rates used to discount individual cash flows of the bond. Hence, a whole range of different spot rates is typically used when equalizing bond's future cash flows to its present value.
To bootstrap the yield curve, we will be building upon a fact that all bonds priced at par have coupon rate equal to the yield-to-maturity, as denoted in the following equation:
\begin{equation}\frac{C}{\left ( 1+r \right )^1} + \frac{C}{\left ( 1+r \right )^2}+...+\frac{1+C}{\left ( 1+r \right )^n} = 100\end{equation}Given the face value is $\$100$, coupon rate $C$ is equal to $\$100∗r$
In case of the continuous compounding of the interests the equation (1) becomes
\begin{equation}C \times e^{-r \times 1} + C \times e^{-r \times 2} + ... + \left ( 1 + C\right ) \times e^{-r \times n} = 100\end{equation}Starting from first bond which matures in three months, we will gradually derive all spot rates by forward substitution of the previously calculated ones. This can be best illustrated on a numerical example.
All the computations will be done with the day count convention 30/360. This convention is commonly called Bond Basis.
Starting from the bond which pays both quarterly coupon and principal in 3 months. By applying the fomula (2), we get
\begin{equation} \left ( 100 + 0\right ) \times e^{-r \times t} = 97.5 \end{equation}As we mentioned above the trade date is
'2021-05-06'
So, the related maturity date computed by adding 3 months to the above trade date is
'2021-08-06'
The year fraction between the above trade date and maturity date in the basis 30/360 is
0.25
Right now, from the equation (3) we deduce by replacing t by the year fraction 0.25 that
So, the computed zero-coupon is
'0.10127123'
Now, for a zero-coupon with a maturity of 6 months, it will receive a single coupon. By applying the fomula (2), we get
\begin{equation} \left ( 100 + 0\right ) \times e^{-r \times t} = 94.9 \end{equation}Its related maturity date computed by adding 6 months to the above trade date is
'2021-11-06'
The year fraction between the above trade date and maturity date in the basis 30/360 is
0.5
Right now, from the equation (4) we deduce by replacing t by the year fraction 0.5 that
So, the computed zero-coupon is
'0.10469296'
Now, for a zero-coupon with a maturity of 1 year, it will receive a single coupon. By applying the fomula (2), we get
\begin{equation} \left ( 100 + 0\right ) \times e^{-r \times t} = 90.0 \end{equation}Its related maturity date computed by adding 1 year the above trade date is
'2022-05-06'
The year fraction between the above trade date and maturity date in the basis 30/360 is
1
Right now, from the equation (5) we deduce by replacing t by the year fraction 0.5 that
So, the computed zero-coupon is
'0.10536052'
Now, for a zero-coupon with a maturity of 1 year and 6 monts , it will receive three coupons at 6M, 1Y and 1Y6M. By applying the fomula (2), we get
\begin{equation} 4 \times e^{-0.10469296 \times 0.5} + 4 \times e^{-0.10536052 \times 1} + \left ( 100 + 4\right ) \times e^{-r \times t} = 96.0 \end{equation}Its related maturity date computed by adding 1 year and 6 months the above trade date is
'2022-11-06'
The year fraction between the above trade date and maturity date in the basis 30/360 is
1.5
Right now, from the equation (6) we deduce by replacing t by the year fraction 1.5 that
So, the computed zero-coupon is
'0.10680926'
Now, for a zero-coupon with a maturity of 1 year and 6 monts , it will receive four coupons at 6M, 1Y, 1Y6M and 2Y. By applying the fomula (2), we get
\begin{equation} 6 \times e^{-0.10469296 \times 0.5} + 6 \times e^{-0.10536052 \times 1} + 6 \times e^{-0.10680926 \times 1.5} + \left ( 100 + 6\right ) \times e^{-r \times t} = 101.6 \end{equation}Its related maturity date computed by adding 2 years the above trade date is
'2023-05-06'
The year fraction between the above trade date and maturity date in the basis 30/360 is
2
Right now, from the equation (7) we deduce by replacing t by the year fraction 2 that
So, the computed zero-coupon is
'0.10808028'
maturity date | zero coupon | |
---|---|---|
0 | 2021-08-06 | 0.101271 |
1 | 2021-11-06 | 0.104693 |
2 | 2022-05-06 | 0.105361 |
3 | 2022-11-06 | 0.106809 |
4 | 2023-05-06 | 0.108080 |
Here is the final table
bond type | face value | interest periodicity | maturity | coupon rate | price | maturity date | zero coupon | |
---|---|---|---|---|---|---|---|---|
0 | zero_coupon | 100 | 0D | 3M | 0.00 | 97.5 | 2021-08-06 | 0.101271 |
1 | zero_coupon | 100 | 0D | 6M | 0.00 | 94.9 | 2021-11-06 | 0.104693 |
2 | zero_coupon | 100 | 0D | 1Y | 0.00 | 90.0 | 2022-05-06 | 0.105361 |
3 | fixed_rate | 100 | 6M | 1Y6M | 0.08 | 96.0 | 2022-11-06 | 0.106809 |
4 | fixed_rate | 100 | 6M | 2Y | 0.12 | 101.6 | 2023-05-06 | 0.108080 |
<AxesSubplot:xlabel='maturity date'>